package modelo.datos;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import modelo.adaptadores.EntradaAdapter.AdaptedEntrada;

@XmlRootElement(name = "entrada")
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(propOrder = { "nombre", "apellidos", "nif", "self", "parent" })
// El acceso es por propiedad,
// la clase padre debe tener getter/setters
// y tambi�n las hijas.
public class Persona extends Entrada {
    private String apellidos;

    // @XmlTransient
    // public static final Persona NULL = new Persona();

    public Persona() {
	super();
    }

    public Persona(String nombre, String apellidos, String nif) {
	super(nombre, nif);
	this.apellidos = apellidos;
    }

    public String getApellidos() {
	return apellidos;
    }

    public void setApellidos(String apellidos) {
	this.apellidos = apellidos;
    }

    // @Override
    public void actualiza(Entrada entrada) {
	Persona persona = (Persona) entrada;
	setNombre(persona.getNombre());
	setApellidos(persona.getApellidos());
    }

    @Override
    public String toString() {
	return getNombre() + ", " + apellidos + ", " + getNif();
    }

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = super.hashCode();
	result = prime * result
		+ ((apellidos == null) ? 0 : apellidos.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (!super.equals(obj))
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	Persona other = (Persona) obj;
	if (apellidos == null) {
	    if (other.apellidos != null)
		return false;
	} else if (!apellidos.equals(other.apellidos))
	    return false;
	return true;
    }

    @Override
    public AdaptedEntrada mapea() {
	AdaptedEntrada adaptedEntrada = new AdaptedEntrada();
	adaptedEntrada.nombre = getNombre();
	adaptedEntrada.apellidos = getApellidos();
	adaptedEntrada.nif = getNif();
	adaptedEntrada.self = getSelf();
	adaptedEntrada.parent = getParent();
	return adaptedEntrada;
    }
}
